// proxy
let obj = new Proxy({}, {
    get: function (target, propKey, receviver) {
        console.log(`getting ${propKey}`);
        return Reflect.get(target, propKey, receviver)
    }
})

// 对空对象进行拦截、重新定义属性的读取操作 get set 

/*  
    get() 方法实例
    get 方法拦截某个属性的读取操作、接收三个对象： 目标对象、属性名、proxy实例本身
*/
let person = {
    name: 'zhangsan'
}

let myproxy = new Proxy(person, {
    get: function(target, propKey) {
        if(propKey in target) {
            return target[propKey];
        } else {
            throw new ReferenceError(`${propKey} does not exist!`)
        }
    }
})

// 相关拦截是针对 myproxy 这个proxy对象的拦截  并且proxy中的get 可以通过Object.create()继承
// proxy 强大的 链式调用处理

let pipe = function (value) {
    let funcStack = [];
    let proxy = new Proxy({}, {
        get: function(popeObject, fnName) {    // target propKey
            if(fnName === 'get') {
                return funcStack.reduce(function(val, fn) {   // 累加折叠操作
                    return fn(val);
                }, value)  // 初始值
            }
            funcStack.push(window[fnName]);
            return proxy;
        }
    })
    return proxy;
}

//  如果一个属性不可配置（configurable）且不可写（writable），则 Proxy 不能修改该属性，否则通过 Proxy 对象访问该属性会报错。

/* 
    proxy set 方法 四个参数接收： 目标对象、属性名、属性值、proxy实例本身
*/
function loadImage(url) {
    return new Promise(function (resolve, reject) {
        const image = new Image();

        image.onload = function() {
            resolve(image);
        }
    })
}


// promise 一旦状态被改变就永远不会再变化
getJSON('/post/1.json').then(post => getJSON(post.commentUrl)).then(
    comments => console.log(),  // success
    err => console.log(err),    // error
)